package com.ys.day27.p5自定义线程池;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 描述: CustomThreadPoll
 * 自定义线程池
 * * 创建自定义线程池步骤：
 *  * 1 定义线程池对象ThreadPoolExecutor,一个项目只有一个线程池，将其定义为static属性
 *  * 2 定义工具方法
 *  * 3 在创建之前先判断线程池对象是否为空，如果为空创建线程池对象，如果非空直接返回已创建的线程池对象
 * @author CodeYang
 * @version 2021/1/7 0:51
 */
public class CustomThreadPoll {

    /**
     * 线程池对象
     * 1、静态变量--类变量。 由static修饰的du变量称为静态变量，其实质上就是一个全局变量。如果某个内容是被所有对象所共享，
     *  那么该内容就应该用静态修饰；没有被静态修饰的内容，其实是属于对象的特殊描述。
     *   静态 成员对象 静态变量实质上是一个全局变量,是类在加载中就会直接执行的
     */
    private static ThreadPoolExecutor pool = null;

    /**
     *  当创建资源特别大的时候一般使用 该技术|方法 返回对象资源,减少消耗
     * @return
     * @throws Exception
     */
    public static ThreadPoolExecutor createThreadPool () throws  Exception{
        /**
         *  如果调用该静态方法时,线程池为空,创建线程池,否则直接返回 存在的线程池对象
         */
        if (null == pool ){
            /**
             * 注意: 1自定义的线程池 核心线程数量和最大线程数量必须保持一直. 可以减少垃圾回收的频率,(GC 和 new 都是比较消耗资源的)
             * 2: 队列大小,工作中灵活设置
             * 3:核心线程数,一般不超过500
             */
            pool = new ThreadPoolExecutor(
                     5,
                     5,
                     0L,
                     TimeUnit.MICROSECONDS,
                     new LinkedBlockingQueue<>(50));
        }
        //线程池肯定不为空
        return pool;
    }


}
